import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:get/get.dart';
import 'dart:math' as math;
import 'package:flutter/foundation.dart';
import 'dart:io';
import 'package:path_provider/path_provider.dart';

class ClearCacheController extends GetxController {
  // 清理状态：0-未开始，1-清理中，2-清理完成
  final clearStatus = 0.obs;
  
  // 缓存大小（以字节为单位）
  final cacheSize = 0.obs;
  
  // 是否正在旋转圆环6
  final isSpinning = false.obs;
  
  // 旋转角度
  final rotationAngle = 0.0.obs;

  @override
  void onInit() {
    super.onInit();
    // 初始化时获取缓存大小
    _getCacheSize();
  }

  // 获取缓存大小
  Future<void> _getCacheSize() async {
    try {
      // 获取应用文档目录
      final appDir = await getApplicationDocumentsDirectory();
      final tempDir = await getTemporaryDirectory();
      
      debugPrint('App Directory: ${appDir.path}');
      debugPrint('Temp Directory: ${tempDir.path}');
      
      // 计算缓存大小
      int size = 0;
      size += await _calculateDirectorySize(appDir);
      size += await _calculateDirectorySize(tempDir);
      
      debugPrint('Total Cache Size: $size bytes');
      
      // 如果实际计算的大小为0，则使用模拟数据（仅在开发环境中）
      if (size == 0) {
        debugPrint('Using simulated cache size for development');
        // 生成一个随机的模拟缓存大小（1MB到50MB之间）
        final random = math.Random();
        size = (random.nextDouble() * 49 + 1) * 1024 * 1024 ~/ 1; // 1MB to 50MB
      }
      
      cacheSize.value = size;
    } catch (e) {
      debugPrint('获取缓存大小时出错: $e');
      // 出错时也使用模拟数据（仅在开发环境中）
      final random = math.Random();
      cacheSize.value = (random.nextDouble() * 49 + 1) * 1024 * 1024 ~/ 1; // 1MB to 50MB
    }
  }

  // 计算目录大小
  Future<int> _calculateDirectorySize(Directory directory) async {
    int size = 0;
    try {
      debugPrint('Checking directory: ${directory.path}');
      if (await directory.exists()) {
        debugPrint('Directory exists');
        int fileCount = 0;
        await for (FileSystemEntity entity in directory.list(recursive: true, followLinks: false)) {
          if (entity is File) {
            try {
              int fileSize = await entity.length();
              size += fileSize;
              fileCount++;
              debugPrint('File: ${entity.path}, Size: $fileSize');
            } catch (e) {
              debugPrint('Error getting file size for ${entity.path}: $e');
            }
          }
        }
        debugPrint('Total files in ${directory.path}: $fileCount');
      } else {
        debugPrint('Directory does not exist: ${directory.path}');
      }
    } catch (e) {
      debugPrint('计算目录大小时出错: $e');
    }
    debugPrint('Directory ${directory.path} total size: $size bytes');
    return size;
  }

  // 将字节转换为可读格式
  String formatBytes(int bytes) {
    if (bytes <= 0) return "0 B";
    const suffixes = ["B", "KB", "MB", "GB", "TB"];
    var i = (math.log(bytes) / math.log(1024)).floor();
    return ' ${suffixes[i]}';
  }

    String valueBytes(int bytes) {
    if (bytes <= 0) return "0 B";
    const suffixes = ["B", "KB", "MB", "GB", "TB"];
    var i = (math.log(bytes) / math.log(1024)).floor();
    return '${(bytes / math.pow(1024, i)).toStringAsFixed(1)}';
  }

  // 开始清理缓存
  void startClearCache() async {
    // 设置状态为清理中
    clearStatus.value = 1;
    isSpinning.value = true;
    
    // 执行实际的缓存清理
    await _clearActualCache();
    
    // 清理完成后重新获取缓存大小
    await _getCacheSize();
    
    // 清理完成
    clearStatus.value = 2;
    isSpinning.value = false;
    
    // 显示清理完成提示
    Get.snackbar('提示', '缓存清理完成');
  }

  // 实际清理缓存的方法
  Future<void> _clearActualCache() async {
    try {
      // 分步骤执行不同的清理操作
      await _clearImageCache();
      await _clearTemporaryFiles();
      await _finalClear();
      await Future.delayed(const Duration(milliseconds: 500)); 
    } catch (e) {
      // 如果出现错误，显示错误提示
      Get.snackbar('错误', '清理缓存时出现错误: $e');
      clearStatus.value = 0; // 重置状态
      isSpinning.value = false;
    }
  }

  // 清理图片缓存
  Future<void> _clearImageCache() async {
    try {
      // 使用flutter_cache_manager清理图片缓存
      // 清除所有缓存的图片
      await DefaultCacheManager().emptyCache();
    } catch (e) {
      debugPrint('清理图片缓存时出错: $e');
    }
  }

  // 清理临时文件
  Future<void> _clearTemporaryFiles() async {
    try {
      // 获取临时目录
      final tempDir = await getTemporaryDirectory();
      
      // 清理临时目录中的文件
      if (await tempDir.exists()) {
        await for (FileSystemEntity entity in tempDir.list(recursive: true, followLinks: false)) {
          try {
            if (entity is File) {
              await entity.delete();
            } else if (entity is Directory) {
              await _deleteDirectory(entity);
            }
          } catch (e) {
            debugPrint('删除临时文件时出错: $e');
          }
        }
      }
    } catch (e) {
      debugPrint('清理临时文件时出错: $e');
    }
  }

  // 最终清理
  Future<void> _finalClear() async {
    try {
      // 执行最终的清理操作
      // 可以在这里添加其他需要清理的项目
      // 例如清理应用文档目录中的缓存文件
      final appDir = await getApplicationDocumentsDirectory();
      
      // 删除应用文档目录中的缓存文件（以.cache结尾的文件）
      if (await appDir.exists()) {
        await for (FileSystemEntity entity in appDir.list(recursive: false, followLinks: false)) {
          if (entity is File && entity.path.endsWith('.cache')) {
            await entity.delete();
          }
        }
      }
    } catch (e) {
      debugPrint('最终清理时出错: $e');
    }
  }

  // 递归删除目录
  Future<void> _deleteDirectory(Directory directory) async {
    try {
      if (await directory.exists()) {
        await for (FileSystemEntity entity in directory.list(recursive: false, followLinks: false)) {
          if (entity is File) {
            await entity.delete();
          } else if (entity is Directory) {
            await _deleteDirectory(entity);
          }
        }
        await directory.delete();
      }
    } catch (e) {
      debugPrint('删除目录时出错: $e');
    }
  }

  // 更新旋转角度（用于动画）
  void updateRotation() {
    if (isSpinning.value) {
      rotationAngle.value += 0.01; // 减慢旋转速度，从0.1改为0.05
      // 确保角度不会无限增长
      if (rotationAngle.value > 2 * math.pi) {
        rotationAngle.value -= 2 * math.pi;
      }
    }
  }
}